c# - 使用泛型方法返回 list<T>,其中 T 可以是共享相同结构的三种类型之一

标签 c# linq-to-sql

我有一些使用不同源表的 sql View ,但每个 View 都返回完全相同的结构。

非常简单:

view1
    select tblA.Name as custName,
           tblA.DOB as DateOfBirth,
           tblA.accountBalance as AccountBalance
    from myFirstTable tblA

view2
    select tblB.AccountName as custName,
           tblB.BirthDate as DateOfBirth,
           tblB.Balance as AccountBalance
    from mySecondTable tblB

view3
    select tblC.CustomerName as custName,
           tblC.DateOfBirth as DateOfBirth,
           tblC.accBal as AccountBalance
    from myThirdTable tblC

因此,即使源表中的字段名不同,不同的 View 也会返回同名(和类型)的字段。实际 View 复杂而庞大,每个 View 有数百行。

然后我将这些 View 拖到我的 Linq-to-sql 设计器中,并尝试在通用类中使用它们。

    public static List<T> MainSearch<T>(ReportParams RP)
    {
        MyDataContext dc = new MyDataContext();

        if (string.IsNullOrEmpty(RP.appType)) { return null; }

        var searchQuery = new List<T>();

        switch (RP.appType)
        {
            case "type1":
                searchQuery = (from t in dc.view1s select t);
                break;
            case "type2":
                searchQuery = (from t in dc.view2s select t);
                break;
            case "type3":
                searchQuery = (from t in dc.view3s select t);
                break;
        }

        //do other stuff with search query depending on params
        DateTime dtFrom = Convert.ToDateTime(RP.fromDate);
        searchQuery = searchQuery.Where(q => convert.ToDateTime(q.DateOfBirth) >= dtFrom);

        //and so on...

想法是可以使用通用前端,根据用户选择传入参数,然后使用这些参数缩小搜索结果的范围,以搜索特定源数据(永远不会返回组合) ,它始终是三个 View 中的一个或另一个)。

上面的代码不起作用。在我的 switch 语句中,智能感知提示它无法从特定类型(例如 view1)隐式转换为 T 的泛型列表。这让我无法在 lambda 表达式中进一步使用强类型。

有什么方法可以实现我正在尝试做的事情,还是我在这里咆哮完全错误的树?

最佳答案

我还没有对此进行全面测试,但我认为您可以通过创建一个具有属性 custName、DOB 和 AccountBalance 的接口(interface)来实现。然后让每个生成的 LINQ-to-SQL 类(tblA、tblB、tblC)在单独的部分类文件中实现此接口(interface)。只要属性名称和类型匹配,这应该没问题。

interface IAccountTable
{
    string custName { get; set; }
    DateTime DOB { get; set; }
    Decimal AccountBalance { get; set; }
}

partial class tblA : IAccountTable
{
}

使您的 searchQuery 成为该接口(interface)的列表。

var searchQuery = new List<IAccountTable>();

将您实际查询的结果转换到界面。

searchQuery = tblA.Where(t => t.custName == "Uday").Select(t => (IAccountTable)t).ToList();

关于c# - 使用泛型方法返回 list<T>,其中 T 可以是共享相同结构的三种类型之一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35344220/

相关文章:

c# - EF6 - 在应用程序配置文件中找不到名为 'Data Source=...' 的连接字符串

c# - 查询 id 等于其他列的 id

c# - LINQ to SQL 插入失败

linq - LINQ和处理回滚

c# - 从 CLR 样式的类型全名获取 C# 样式的类型引用

c# - 将委托(delegate)定义为函数指针

c# - 结构和计算器 C#

c# - ASP.NET MVC 3 - Linq to SQL 对象存储在 session 中

.net - Linq to SQL中是否提供Unpivot(非枢轴)功能?如何?

c# - Linq 在不传递上下文的情况下编译查询