假设我们需要从表中选择两组:“事物”
var GradeA = db.Things.Where(t=> condition1);
var GradeB = db.Things.Where(t=> !condition1 && condition2);
var DesiredList = GradeA.union(GradeB);
或者,我们需要编写一条语句来避免union
成本:
var DesiredList = db.Things.Where(t=> condtion1 || (!condition1 && condition2));
问题是查询优化器似乎只将表达式修剪为condition2。
如何保持条件1和条件2之间的优先级
现实生活中的示例解决方法是:
/// <summary>
/// Gets only first BookTag for each tag word, chooses the one of this user (if exists).
/// </summary>
/// <param name="book"></param>
/// <returns></returns>
public static IQueryable<BookTag> UniqueByTags(this IQueryable<BookTag> bookTags, User user)
{
return bookTags.GroupBy(BT => BT.TagId)
.Select(g => g.Any(bt => bt.UserId == user.Id) ?
new BookTag() { User = user, Tag = g.First().Tag, Book = bookTags.First().Book } :
new BookTag() {User = g.First().User, Tag = g.First().Tag, Book = bookTags.First().Book}
);
}
编辑:
示例是获取自动完成列表:
- 输入:
str
- 输出:开头的
str
东西和包含的东西str
(没有重复)
另一个例子:选择ThingTags
具有 3 个属性的:
ThingID
UserID
TagID
我们只想ThingTag
为每个选择一个,TagID
条件是如果存在UserID
,我们选择具有等于参数的那个,否则选择第一个。ThingTag
TagID
还在我这儿 ?希望如此 :)