2013-09-26 3 views
0

문자열 식의 값을받는 방법 :내가 문자열 내 DB에 저장된

"Users.ElementAt(1).LastName" 

내가 다음 오브젝트과 같이 있습니다 : 구문 분석하는 중 하나 방법이 있나요

 MyClass myclass = new MyClass() 
     { 
      Users = new List<User>() 
      { 
       new User() 
       { 
        LastName = "LastName1" 
       }, 
       new User() 
       { 
        LastName = "LastName2" 
       }, 
      } 
     }; 

을/평가/내 개체에 대한 주어진 문자열을 실행하여 각 사용자의 성을 얻으시겠습니까?

나는 DynamicLinq 라이브러리를 사용하고 있지만, (1) 오류 메시지와 함께 내가 ElementAt에 문제로 실행하고 있습니다 :

사람이 할 수있는 "적용 가능한 집계 방법 'ElementAt은'존재하지 않는" 여기에 약간의 지침을 제공합니까? 내 파서를 작성하고 리플렉션을 사용해야 할 것인가?

+0

'사용자 '목록에서 각'사용자'를 반복하고 성을 얻고 싶습니까? 아니면 인덱스 1의 'User' 성을 꺼내고 싶습니까? –

+0

비슷한 질문 : http://stackoverflow.com/questions/11479525/how-to-turn-a-string-into-a-linq-expression http://stackoverflow.com/questions/714799/is - 쉽게 - 방법 - 구문 분석 - 람다 - 표현 - 문자열 - 액션 - 드레가 http://stackoverflow.com/questions/10114841/how-to-create-dynamic- lambda-linq-expression-from-c-string-in-c 도울 수 있습니다 : http://blogs.msdn.com/b/marcinon/archive/2010/01/14/building- custom-linq-expressions-made-easy-with-dynamicqueryable_2e00_.aspx –

+0

@NickDeVore 두 번째 사용자의 성을 입력하면됩니다. 웬일인지 내 인용문이 저장되지 않았습니다. 이것은 객체가 아닙니다. 이것은 데이터베이스의 문자열입니다. –

답변

0

그것은 DynamicLinq의 표현 파서처럼 보인다는 표준 LINQ 연산자 방법의 하위 집합을 지원합니다. 좋은 소식은 void ElementAt(int index);IEnumerableSignatures에 추가하는 것만으로도 문제가없는 것 같습니다. 물론, 사용중인 LINQ 쿼리 공급자가 ElementAt 연산자를 처리한다고 가정하면됩니다. 그것이 전적으로 가능하지 않을 수도 있습니다.

그러나 DynamicLinq 소스를 수정할 수없는 경우, 아니요, 코어 .NET Framework 또는 LINQ 내에 이러한 종류의 표현을 구문 분석하고 평가할 기능이 없습니다. 다른 옵션 (ScriptCS, Roslyn 참조)이 있지만 실제 문제를 해결하기 위해 "과잉 공격"솔루션을 사용하고 있다고 생각합니다.

+0

이전에이 컬렉션을 게시 한 저에게 ElementAt를 추가했는데 작동하지 않았습니다. 다시 시도해야 할 수도 있습니다. 소스 컬렉션은 ElementAt가있는 목록입니다. 나는 우리가 이것을 사용하는 것이 과잉이라고 생각하지 않는다. 우리는 다른 해결책으로 이것을 극복했지만 우리는 여전히 이것을 조사하고 있습니다. 도움을 주셔서 감사합니다, 지금까지 최고의 답변은 내가 올바른 것으로 표시됩니다. –

+0

'IQueryable'은'ElementAt()'도 선언하지 않습니다. DynamicLinq은 내부의 'IEnumerableSignatures' 인터페이스를 알려진 확장 메소드와 일치시키기위한 일종의 참조 차트로 사용합니다. 그러나, 목표 유형이'IQueryable'을 구현하면 (단지'IEnumerable' 만 구현하는 것이 아니라) 일치하는 것을 찾는다 고 믿기 때문에 그 이름은 오해의 소지가 있습니다. 소스 콜렉션을 IQueryable을 구현하는 타입으로 만들거나리스트에서'AsQueryable()'을 호출하는 래퍼 프로퍼티를 제공하면 작동 할 것입니다. 귀하의 게시물에있는 오류 텍스트를 기반으로 이미이 작업을 수행 중이라고 가정했습니다. 내 실수. –

+0

수정. 나는 주변의 일을 알아 내야 할 것이다. –

0

원하는 작업을 수행하기 위해 동적 인 linq이 필요한지 확실하지 않습니다. 그냥 평범한 System.Linq 위치의 인덱스를 찾는 처리해야합니다 또한 잘 작동해야합니다에서 C#을 사용하는 경우 4.5 또는 4.0 내 경험에. 여기에 잘 작동합니다 간단한 콘솔 응용 프로그램입니다 :

Console.WriteLine("Index of Dilat: " + Users.FindIndex(n => n.LastName.Equals("Dilat"))); 
:

using System; 
using System.Collections.Generic; 
using System.Linq; 


public class User 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 


class Program 
{ 
    public static List<User> Users; 

    static void Main(string[] args) 
    { 
      Users = new List<User> 
      { 
       new User 
        { 
         FirstName = "Brett", 
         LastName = "M" 
        }, 
       new User 
        { 
         FirstName = "John", 
         LastName = "Doe" 
        }, 
      new User 
       { 
        FirstName = "Sam", 
        LastName = "Dilat" 
       } 
      }; 

     Console.WriteLine("Should work as long as object is defined and instantiated"); 
     Console.WriteLine(Users.ElementAt(1).FirstName); 


     Console.WriteLine("\nIterate Through List with Linq\n I use a string you can add to another list or whatever\n\n"); 

     string s = ""; 

     Users.ForEach(n => s += "Position: " + Users.IndexOf(n) + " " + n.LastName + Environment.NewLine); 
     Console.WriteLine(s); 

     Console.ReadLine(); 
    } 

} 

을 그리고 당신은 당신이 'FindIndex'방법을 사용할 수 모음의 속성에 의해 집합에서 특정 객체를 찾으려면

문자열을 분할 할 때 편집 9-27-13.

문자열을 가져 와서 반복 할 수있는 좋은 목록으로 분할하려는 경우에도 그렇게 할 수 있습니다. 당신은 seperator를 찾을 필요가 있습니다. 가지고 있지 않다면 좀 더 복잡한 정규식 마법을 사용해야 할 것입니다.

같은 모든 유지하지만 내 주요 방법을 대체 :

string split = "Brett,Same,John,Frank"; 

     List<string> stringList = split.Split(',').ToList(); 

     string s = ""; 

     stringList.ForEach(n => s += n + Environment.NewLine); 

     s += "\n\nFor Observing Element at\n"; 

     s += "John is at: " + stringList.FindIndex(n => n.Equals("John")); 

     s += "\n\nGetting Poco Objects assigned and listed\n"; 

     var list = stringList.Select(u => new User 
      { 
       FirstName = u, 
       LastName = "Something" 
      }).ToList(); 

     list.ForEach(n => s += "User: " + n.FirstName + " " + n.LastName + "At: " + list.IndexOf(n) + Environment.NewLine); 
+0

죄송합니다. 내 질문에 내가 편집 한 표현식 따옴표가 없습니다. 저는 인스턴스가 없습니다. 객체에 적용해야하는 문자열입니다. –

+0

문자열을 새 목록으로 분할하여 반복합니다. 업데이트 된 답변을 참조하십시오. – djangojazz

+0

이것은 제가 원하는 것입니다. 나는 사용자 이름을 가지고 있지 않다. 문자열을 사용하는 객체로부터 그것들을 원한다. 나는 그것을.로 나누고 각각을 표현식으로 부를 것입니다. ElementAt()와 관련된 문제가 있습니다. –

0
var allLastNamesInList= Users.Select(x=> x.LastName).toList(); 

이 문 목록을 반복하고 모든 성과 이름을 얻을 것이다. 순서대로 성을 사용할 수 있도록 주문을 사용할 수도 있습니다.

찾고있는 것이거나 다른 것입니까?

interface IEnumerableSignatures 
{ 
    void Where(bool predicate); 
    void Any(); 
    void Any(bool predicate); 
    void All(bool predicate); 
    void Count(); 
    void Count(bool predicate); 
    void Min(object selector); 
    void Max(object selector); 
    void Sum(int selector); 
    void Sum(int? selector); 
    void Sum(long selector); 
    void Sum(long? selector); 
    void Sum(float selector); 
    void Sum(float? selector); 
    void Sum(double selector); 
    void Sum(double? selector); 
    void Sum(decimal selector); 
    void Sum(decimal? selector); 
    void Average(int selector); 
    void Average(int? selector); 
    void Average(long selector); 
    void Average(long? selector); 
    void Average(float selector); 
    void Average(float? selector); 
    void Average(double selector); 
    void Average(double? selector); 
    void Average(decimal selector); 
    void Average(decimal? selector); 
    void Take(int count); 
    void Union(IQueryable right); 
    void OrderBy(LambdaExpression exp); 
    void OrderByDescending(LambdaExpression exp); 
} 

당신이 볼 수 있듯이, ElementAt 그들 가운데되지 않습니다 :

+0

예, 문자열이 아니고 객체가 아닙니다. 게시 할 때 실수로 변경했습니다. 차이점을 확인하십시오. –

+0

예. 위의 명령문은 List의 모든 성을 제공합니다. List allLastNamesInList = Users.Select (x => x.LastName) .toList();'var를 넣더라도 자동으로 cast가 입력됩니다. 둘 다 작동 할 것입니다 –