将ITable转换为IEnuerable <object> - 动态LINQ to SQL查询,没有DataTable信息

时间:2017-02-19 19:23:25

标签: c# linq linq-to-sql dynamic-linq

我需要编写动态LINQ,其中我对输入表一无所知 - 数据提供者(这就是我使用LINQ to SQL的原因),没有表名,什么都没有。我希望能够查询给定用户选择的字段和给定值的数据,如下所示:

拥有String TheTableNameSystem.Data.Linq.DataContext TheContext

    IEnumerable<object> GetQuery(List<string> theWhereFields, List<string> theWhereValues)
    {
        // for doing dynamically ala http://stackoverflow.com/a/25859319/3661120            

        var baseTable = (ITable)TheContext.GetType()
                            .GetProperty(TheTableName).GetValue(TheContext, null); // http://stackoverflow.com/a/1924966/3661120                       

        IEnumerable<object> query = (IEnumerable<object>) baseTable;
        for (int i = 0; i < theWhereFields.Count; i++)
        {
            var whereField = theWhereFields[i];
            var whereValue = theWhereValues[i];
            query = query.Where(whereField + "=" + whereValue);  // possible due to System.Linq.Dynamic
        }

        return query;            
    }

ITable投放到IEnumerable<object>是否正确,因为我已经在这里完成了?

注意ITable来自System.Data.Linqhttps://msdn.microsoft.com/en-us/library/system.data.linq.itable(v=vs.110).aspx

1 个答案:

答案 0 :(得分:1)

简答

NO。

长答案

ITable有这个签名:

public interface ITable : IQueryable, IEnumerable

如果你有一个实现它的类型的实例,如下所示:

public class MyTable : System.Data.Linq.ITable
{
    // Implementation ...
}

你这样做:

var myTable = new MyTable();
var iterator = myTable as IEnumerable<Object>;

它将返回null,因为MyTable实现了ITable,并且它们都没有实现IEnumerable<T>接口。

然而,这将有效:

var iterator = myTable as IEnumerable; // or IQueryable

因此,取决于Is it correct to cast the ITable to an IEnumerable<object> as I've done here的含义。它不会抛出异常,但是在你使用它之前它永远不会产生任何结果,它会在这一行上以空引用异常爆炸:

query = query.Where(whereField + "=" + whereValue);