Метод «Равный» не поддерживается - PullRequest
0 голосов
/ 23 марта 2011
public List<Health_Scheme_System.Employee> GetPenEmployeeTable()
{   
    Health_Scheme_System.Health_Scheme_SystemDB db = new Health_Scheme_System.Health_Scheme_SystemDB();

    var x = (from c in db.Employees
             where c.Pensioners.Equals (1) 
             select c); 

    return x.ToList();
}   

//Selecting multiple columns from an HR view table together with the scheme name of scheme.
public List<EmployeesX> GetPensioners()
{   
    Health_Scheme_System.Health_Scheme_SystemDB db = new Health_Scheme_System.Health_Scheme_SystemDB();

    List<Health_Scheme_System.EmployeeDirectory> listEmployeeView = GetPenEmployeeView();
    List<Health_Scheme_System.Employee> listEmployeeTable = GetPenEmployeeTable();
    List<Health_Scheme_System.Scheme> listSchemes = GetSchemes();

    List<EmployeesX> listOfEmployees = new List<EmployeesX>();

    //checking for comparision of getemployeeview to getemployee table and then to getschemes
    //Then display the scheme name if they are similar.
    for (int i = 0; i < listEmployeeView.Count; i++)
    {   
        EmployeesX emp = new EmployeesX();
        emp.ID_NO = listEmployeeView[i].ID_NO;
        emp.FIRST_NAME = listEmployeeView[i].FIRST_NAME;
        emp.LAST_NAME = listEmployeeView[i].LAST_NAME;
        emp.LOCATION_CODE = listEmployeeView[i].LOCATION_CODE;

        for (int j = 0; j < listEmployeeTable.Count; j++)
        {   
            if (listEmployeeTable[j].EmployeeIDCard == listEmployeeView[i].ID_NO)
            {   
                emp.Pensioners = listEmployeeTable[j].Pensioners;

                    for (int k = 0; k < listSchemes.Count; k++)
                    {   
                        if (listEmployeeTable[j].SchemeID == listSchemes[k].SchemeID)
                        {   
                            emp.SCHEME_NAME = listSchemes[k].Name;
                            emp.START_DATE = listEmployeeTable[j].StartSchemeDate;
                        }   
                    }   
            }   
        }   
        listOfEmployees.Add(emp);
    }   
    return listOfEmployees;
}   

Как я могу сделать тот же метод с использованием .equals ??

1 Ответ

0 голосов
/ 23 марта 2011

Вы пробовали это:

var x = (from c in db.Employees
         where c.Pensioners == 1
         select c)

Дополнительная информация:

Если вы используете метод для объекта в запросе linq, то дозвуковой системе необходимо знать, как преобразовать его в чистый SQL-код. Это не работает по умолчанию и должно быть реализовано для каждого известного метода для каждого поддерживаемого типа для каждого поставщика данных (если отличается от реализации по умолчанию). Так что для дозвуковой работы есть куча работы.

Хорошей отправной точкой для определения того, что поддерживается, а что нет, является класс TSqlFormatter. Посмотрите на protected override Expression VisitMethodCall(MethodCallExpression m)

https://github.com/subsonic/SubSonic-3.0/blob/master/SubSonic.Core/Linq/Structure/TSqlFormatter.cs

Уже есть реализация для Equals

        else if (m.Method.Name == "Equals")
        {
            if (m.Method.IsStatic && m.Method.DeclaringType == typeof(object))
            {
                sb.Append("(");
                this.Visit(m.Arguments[0]);
                sb.Append(" = ");
                this.Visit(m.Arguments[1]);
                sb.Append(")");
                return m;
            }
            else if (!m.Method.IsStatic && m.Arguments.Count == 1 && m.Arguments[0].Type == m.Object.Type)
            {
                sb.Append("(");
                this.Visit(m.Object);
                sb.Append(" = ");
                this.Visit(m.Arguments[0]);
                sb.Append(")");
                return m;
            }
            else if (m.Method.IsStatic && m.Method.DeclaringType == typeof(string))
            {
                //Note: Not sure if this is best solution for fixing side issue with Issue #66
                sb.Append("(");
                this.Visit(m.Arguments[0]);
                sb.Append(" = ");
                this.Visit(m.Arguments[1]);
                sb.Append(")");
                return m;
            }
        }

Полагаю, Prnsioners - это целочисленный тип, поэтому вам, в основном, нужно добавить еще один оператор if и перекомпоновать дозвуковой.

Это должно работать, но я не проверял.

            else if (!m.Method.IsStatic && m.Method.DeclaringType == typeof(int))
            {
                sb.Append("(");
                this.Visit(m.Arguments[0]);
                sb.Append(" = ");
                this.Visit(m.Arguments[1]);
                sb.Append(")");
                return m;
            }

(или вы можете попробовать подход ==, как в примере сверху).

...