1

编辑 1

我很抱歉,但在阅读了 2 篇建议的文章后,我仍然不明白我应该使用什么。我知道由于各种原因不首选使用 IQueryable ,但这是否也消除了 IEnumerable ?DataTable 真的是我最好的选择吗?

简而言之,我猜,首选的返回类型是什么?


我有以下简单的 LINQ 查询,我想将其抽象为 DAL。var 的类型是什么,因此我的方法应该是什么类型?

            ConnectDBDataContext context = new ConnectDBDataContext();

        var lName = textEdit1.Text;

        var searchByPersonLName = from c in context.tblPersons
                                  where c.LastName == lName
                                  orderby c.LastName
                                  select new { c.FirstName,c.LastName,c.PersonID};

        dataGridView1.DataSource = searchByPersonLName;

当我在 VS 中将鼠标悬停在它上面时,它会说IQueryable<T>,但是当我放入断点并运行它时,它似乎称自己为 IEnumerable。哪个是正确的,我应该如何声明我的方法?

像这样 -->

        public static DataTable SearchPerson(string SearhParam)
    {
        ConnectDBDataContext context = new ConnectDBDataContext();
        var persons = (from person in context.tblPersons
                       orderby person.LastName
                       select new { person.PersonID, person.LastName, person.FirstName, person.SSN });
        var filteredPersonsList = persons.Where(p => p.LastName == SearhParam).ToList();
        if (filteredPersonsList.Count == 0)
            filteredPersonsList = persons.Where(p => p.LastName.StartsWith(SearhParam)).ToList();

        var dataTable = filteredPersonsList.CopyLinqToDataTable();

        return dataTable;
    }

如果我使用IQueryable<T>什么是<T>或者我怎么知道,我会返回什么?

谢谢!

供参考 CopyToDataTable() 如下。

public static DataTable CopyLinqToDataTable<T>(this IEnumerable<T> source)
    {
        return new ObjectShredder<T>().Shred(source, null, null);
    }

    public static DataTable CopyLinqToDataTable<T>(this IEnumerable<T> source,
                                                DataTable table, LoadOption? options)
    {
        return new ObjectShredder<T>().Shred(source, table, options);
    }
4

2 回答 2

3

首先,IQueryable 实现了 IEnumerable,这就是为什么您可能会同时看到这两者。请参阅此处了解更多详细信息

一般来说,我会建议您的 DAL 尽可能返回您的实际对象。

我会阅读此博客以获取有关如何执行以及如何不执行您的建议的指南。简短的回答,不要返回 IQueryable。

编辑:示例:

        internal static File[] GetAllFilesByUserID(int userID)
    {
        var db = GetDataContext();
        return (from files in db.Files where files.OwnerUserID == userID select files).ToArray();
    }
于 2009-05-07T19:53:04.280 回答
2

他的意思是将您的数据映射到您希望 DAL 返回的对象。

在回答您的第一个问题时,“var”实际上只是变量的缩写,并且类型是分配中定义的任何类型。

var myvariable = string.empty;

在此示例中,类型是字符串的类型。

var myreader = new StringReader();

而在此示例中,类型是 StringReader 的类型。

至于你关于“什么是”的第二个问题。T 是泛型类型。

例如,您的 dal 将返回实际对象的位置:

 public Product GetProduct(int ProductID)
    {
        var product = from p in db.MyTable
                      where p.productID == ProductID
                      select new product { name = p.name, pricepoint = p.pricepoint, qty = p.quantity };

        return product;
    }
于 2009-05-07T21:57:01.253 回答