LINQ to Entities 让我很郁闷的问题

gaopeng1988 2011-04-01 11:19:29
这是我写的代码,下面有些注释。找人帮忙解决。分不够可以再加

public ViewSearch SearchByTopic(string key)
{
ViewSearch vs = new ViewSearch();
vs.Topic = TopicRepository.Where(t => SplitTopic(t.content, key));
return vs;
}

private bool SplitTopic(string Content, string key)
{
MatchCollection matchs = SplitTopic(Content);
foreach (var mc in matchs)
{
if (mc.ToString().ToLower().IndexOf(key) >= 0)
{
return true;
}
continue;
}
return false;
}

public static MatchCollection SplitTopic(string Content)
{
return Regex.Matches(Content, "<T>(.*?)</T>");
}


其中 [color=#0000FF]ViewSearch
是我自定义的一个模版,
content字段中不知道含有多少个“<T>...</T>”,
key是要检索的关键字。
问题是我想要从表中检索出来content 字段中含有“<T>...</T>”并且在“<T>...</T>”中包含key的数据。
我这样写之后 也面报错信息:

LINQ to Entities 不识别方法“Boolean SplitTopic(System.String, System.String)”,因此该方法无法转换为存储表达式。

真不知道该怎么搞了。求助
[/color]
...全文
201 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 gaopeng1988 的回复:]

代码似乎很强,但是对于我这样的新手实在不知道怎么样向你这样写。。。
[/Quote]

因为那不是Linq to Entities,而是Linq to Objet。
机器人 2011-04-01
  • 打赏
  • 举报
回复
反正都是 T 的集合,我搞不懂的是 ViewSearch.Topic 是什么类型。ICollection<T> ??
因为 Where 返回都是集合。。。Topic 是集合吗?

ViewSearch vs = new ViewSearch();
vs.Topic = TopicRepository.ToList();

这样能通过吗?
机器人 2011-04-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gaopeng1988 的回复:]
数据量不是特别大
但是这个
vs.Topic = TopicRepository.ToList().Where(t => SplitTopic(t.content, key));
得到结果是什么类型的
[/Quote]

TopicRepository.Where --> 返回的是 IQuerable<T>
TopicRepository.ToList --> 返回的是 List<T> --> 再用 Where --> 返回的是 IEnumable<T>

对结果应该没影响。
gaopeng1988 2011-04-01
  • 打赏
  • 举报
回复
代码似乎很强,但是对于我这样的新手实在不知道怎么样向你这样写。。。
Johnyin 2011-04-01
  • 打赏
  • 举报
回复
我贴的那个GetLogCondition 和 GetUserCondition 跟你写的SplitTopic类似啊。
你照着那样写就行了。 lambda支持自定义的查询方法。
  • 打赏
  • 举报
回复
使用数据库认可的表达式。

对于数据库不支持的,你可以首先使用Linq to Entities将结果读取到内存变量,然后对于这个内存变量使用Linq to Object来进一步调用SplitTopic。

不过,之前的Linq to Entities仍然要尽量使用数据库索引、过滤条件,尽量少读内容到内存。如果你发现必须把大量内容读到内存里来使用Linq to Object进行查找,那么最好先想一下是不是设计数据库结构时有严重的问题。
gaopeng1988 2011-04-01
  • 打赏
  • 举报
回复
#6:能解释一下吗
Johnyin 2011-04-01
  • 打赏
  • 举报
回复

Expression<Func<SysLogEntity, bool>> expr = n => GetLogCondition(n, dateBegin, dateEnd);

Expression<Func<SysUsersEntity, bool>> expUser = user => GetUserCondition(user, strUser);

SysLogService ss = new SysLogService();

UserService us = new UserService();

IEnumerable<object> result = from log in ss.Table as IEnumerable<SysLogEntity>
join user in us.Table as IEnumerable<SysUsersEntity>
on log.UserId equals user.ID
where GetLogCondition(log, dateBegin, dateEnd) && GetUserCondition(user, strUser)
select new
{
Name = user.UserName,
Date = log.CreationDate,
Actions = log.Action,
What = log.EntityType,
ID = log.EntityId
} as object;



private bool GetLogCondition(SysLogEntity log,DateTime? dateBegin,DateTime? dateEnd)
{
bool result = true;

if (dateBegin >DateTime.Now.AddYears(-50))
result &= log.CreationDate >= dateBegin;
if (dateEnd > DateTime.Now.AddYears(-50))
result &= log.CreationDate <= dateEnd;
return result;
}

private bool GetUserCondition(SysUsersEntity user, string name)
{
bool result = true;
if (!string.IsNullOrEmpty(name))
result &= user.UserName.Contains(name);

return result;
}

gaopeng1988 2011-04-01
  • 打赏
  • 举报
回复
有办法解决的话,给贴下详细的代码好吗。
实在是想不通该怎么做。
gaopeng1988 2011-04-01
  • 打赏
  • 举报
回复
数据量不是特别大
但是这个
vs.Topic = TopicRepository.ToList().Where(t => SplitTopic(t.content, key));
得到结果是什么类型的
机器人 2011-04-01
  • 打赏
  • 举报
回复
数据量大的话,还是写存储过程比较好。
机器人 2011-04-01
  • 打赏
  • 举报
回复
linq2Entities无法将自定义方法转成sql的。
方法1. 把你这个写成存储过程,再生成linq2entities
方法2. vs.Topic = TopicRepository.ToList().Where(t => SplitTopic(t.content, key));
种草德鲁伊 2011-04-01
  • 打赏
  • 举报
回复
不是什么方法都可以被支持的,表达式树最终是要被翻译成sql语句的,自定义的方法就没办法翻译了。

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧