带有标志列表的Linq查询

本文关键字:Linq 查询 列表 标志 | 更新日期: 2023-09-27 17:50:57

我正在尝试使用Linq查询从数据库获取记录列表。

public void Main() {
    var filter = new Filter();
    filter.ReceiverState = new List<DocumentState> { DocumentState.Completed };
    var q = from d in Documents
            where filter.ReceiverState.Any(f => (d.ReceiverState & (int)f) != 0)
            select d;
    q.Dump();
}
public class Filter {
    public List<DocumentState> ReceiverState { get; set; }
}
[Flags]
public enum DocumentState {
    Sent = 1,
    NeedClarification = 2,
    Completed = 4,
    NeedResign = 8
}

但是我得到这个错误:

局部序列不能在LINQ to SQL的查询操作符实现中使用,除了Contains操作符

我必须在过滤器中使用标记枚举的列表。我如何才能使一个正确的Linq查询?

带有标志列表的Linq查询

应该可以,

var filter = new Filter();
filter.ReceiverStates = new List<DocumentState> { DocumentState.Completed };
var documents = new List<Document>();
var result = documents.Where(d => filter.ReceiverStates.Contains(d.ReceiverState));

你正在传递一个序列(ReceiverState)来比较它与文档,linq sql不这样工作,你能做的是传递一个单一的值来比较,或者另一种方式得到的文档和比较它们与你的列表(ReceiverState)

我不知道你为什么在这里使用列表,我看到你只寻找标记为完成的文档。

(没有尝试任何这段代码,但我知道这种方法将工作,因为我使用它之前)

var q = from d in Documents
        where (DocumentState)d.ReceiverState & DocumentState.Completed == DocumentState.Completed
        select d;

但如果你需要使用列表作为过滤器,你可以尝试这个(不是最好的事情做大量的记录),但它会工作,因为在你开始在文档中循环,它不再linq到sql,基本上你是比较一个单一的值一次

var docs = from d in Documents select d;
foreach(var f in filter.ReceiverState)
{
   docs = docs.Where(x => (DocumentState)x.ReceiverState & f == f)
}